import { defineStore } from 'pinia'
import {
    createRandom,
    deepClone,
    defaultTo,
    errorRequest,
    getToken,
    hrefGetToken,
    hrefRemoveToken
} from "@/utils/setting.js";
import dayjs from "dayjs";
import Socket from "@/utils/socket.js";
import tz from 'dayjs/plugin/timezone'
import utc from 'dayjs/plugin/utc'

dayjs.extend(utc);
dayjs.extend(tz);

// 置顶联系人
const topContact = (data) => {
    const Arr = deepClone(data)
    Arr.forEach((item, index) => {
        if (item.notReadCount > 0) {
            const params = deepClone(item)
            Arr.splice(index, 1)
            Arr.unshift(params)
        }
    })
    return Arr
}

const useSocketStore = defineStore(
'socket',
{
    state: () => ({
        firstEnter: defaultTo(sessionStorage.getItem('firstEnter') === 'true' || !sessionStorage.getItem('firstEnter'), true), // 是否是首次进入
        messageUserList: defaultTo(JSON.parse(sessionStorage.getItem('messageUserList')), []), // 角色列表
        messageHistoryAllList: [], // 所有聊天记录
        socket: null,
    }),
    actions: {
        // 设置默认的onmessage
        setDefaultMessage(callback = () => {}) {
            this.socket.websocket.onmessage = (res) => {
                let data = JSON.parse(res.data || res)
                if (!['chat', 'updateStatus', 'collect'].includes(data.type)) {
                    const code = data.code
                    if (code !== 200) {
                        errorRequest(data) // 处理接口返回失败操作
                    } else {
                        const { type, taskId, contact, content, time } = res.target.params // 本地传递的参数
                        const userKey = this.messageUserList.findIndex(item => {
                            return item.taskId === taskId && item.contacts === contact
                        }) // 用户在列表中的key
                        const historyKey = this.messageHistoryAllList.findIndex(item => {
                            return item.taskId === taskId && item.contact === contact
                        }) // 在历史记录中的key
                        // 获取用户列表
                        if (type === 'CONTACT') {
                            this.messageUserList = topContact(data.data).map((item, index) => {
                                item.time = dayjs(item.time).tz('America/New_York').format('YYYY-MM-DD HH:mm:ss')
                                item.avatar = this.firstEnter || userKey <= -1 ? createRandom(1, 12) : this.messageUserList[userKey].avatar
                                return item
                            })
                            //  存储是否首次进入
                            sessionStorage.setItem('firstEnter', 'false')
                            this.firstEnter = false
                        } else if(type === 'HISTORY') {
                            // 获取与单个用户的聊天历史记录 存在则更改缓存记录 不存在则添加新记录
                            if (historyKey > -1) {
                                this.messageHistoryAllList[historyKey].content = data.data.map(item => {
                                    item.time = dayjs(item.time).tz('America/New_York').format('YYYY-MM-DD HH:mm:ss')
                                    return item
                                })
                            } else {
                                this.messageHistoryAllList.push({
                                    taskId: taskId,
                                    contact: contact,
                                    content: data.data.map(item => {
                                        item.time = dayjs(item.time).tz('America/New_York').format('YYYY-MM-DD HH:mm:ss')
                                        return item
                                    })
                                })
                            }
                            if (userKey > -1) this.messageUserList[userKey].time = data.data.length > 0 ? data.data[data.data.length - 1].time : '' // 更新用户列表单个最后消息时间
                        } else if (type === 'SEND') {
                            this.messageUserList[userKey].time = time // 更改用户列表最新时间
                            this.messageUserList[userKey].notReadCount = 0  // 更改用户列表单个未读数量置0
                            this.messageUserList[userKey].content = content // 更新用户列表最新消息
                        } else if (type === 'COLLECT') {
                            this.messageUserList[userKey].isCollect = !this.messageUserList[userKey].isCollect
                        } else if (type === 'READ') {
                            this.messageUserList[userKey].notReadCount = 0
                        } else if (type === 'COUNT') {
                            // 长度对不上则重新获取用户列表
                            if (this.messageUserList.length !== data.data) this.socket.send({ type: 'CONTACT' })
                        }
                        sessionStorage.setItem('messageUserList', JSON.stringify(this.messageUserList)) // 更新用户列表最新消息 - 本地缓存
                    }
                } else {
                    // 收到新消息 / 更改用户状态 / 收藏
                    const { taskId, contacts } = data
                    const userKey = this.messageUserList.findIndex(item => {
                        return item.contacts == contacts && item.taskId == taskId
                    }) // 用户人下标
                    const messageHistoryKey = this.messageHistoryAllList.findIndex(item => {
                        return item.taskId == taskId && item.contact == contacts
                    }) // 获取当前信息在信息列表中的下标
                    if(data.type === 'chat') {
                        const userParams = {
                            isReply: true,
                            notReadCount: 1,
                            avatar: createRandom(1, 12),
                            contacts: contacts,
                            taskId: taskId,
                            content: data.content
                        }
                        const historyParams = {
                            isSender: data.isSender,
                            taskId: data.taskId,
                            error: false,
                            loading: false,
                            time: dayjs(data.time).tz('America/New_York').format('YYYY-MM-DD HH:mm:ss'),
                            content: data.content
                        }

                        if(userKey > -1) {
                            this.messageUserList[userKey].time = dayjs(data.time).tz('America/New_York').format('YYYY-MM-DD HH:mm:ss')
                            this.messageUserList[userKey].content = data.content // 更新用户联系人最新消息
                            if(!data.isSender) this.messageUserList[userKey].isReply = true // 对方会话后把用户放入到我的会话列表中
                            if(!data.isSender) this.messageUserList[userKey].notReadCount = defaultTo(this.messageUserList[userKey].notReadCount, 0) + 1 // 添加未读数量
                            this.messageUserList = topContact(this.messageUserList) // 给有未读消息的用户置顶
                        } else {
                            this.messageUserList.unshift(userParams) // 添加用户
                        }

                        // 处理聊天记录
                        if (messageHistoryKey > -1) {
                            const messageDetail = this.messageHistoryAllList[messageHistoryKey]
                            historyParams.id = messageDetail.content.length > 0 ? messageDetail.content[messageDetail.content.length - 1]?.id + 1 : 0 // 为收到的消息赋值id
                            this.messageHistoryAllList[messageHistoryKey].content.push(historyParams)
                        }
                    } else if (data.type === 'updateStatus') {
                        if (userKey > -1) {
                            this.messageUserList[userKey].status = data.status
                        }
                    } else if (data.type === 'collect') {
                        if (userKey > -1) {
                            this.messageUserList[userKey].isCollect = data.isCollect
                        }
                    }
                    sessionStorage.setItem('messageUserList', JSON.stringify(this.messageUserList)) // 更新用户列表最新消息 - 本地缓存
                }
                callback(res)
            }
        },
        // 设施默认长连接失败操作
        setDefaultError() {
            this.socket.websocket.onerror = (res) => {
                this.messageUserList = []
                this.messageHistoryAllList = []
                sessionStorage.removeItem('messageUserList') // 删除用户列表缓存
            }
        },
        // 设置长链接
        setWebsocket() {
            this.socket = new Socket({
                url:  `${import.meta.env.VITE_SOCKET_BASE}${import.meta.env.VITE_APP_ENV === 'development' ? '/chn' : '/ws'}/ws/websocket`,
                reconnect: true, // 断线重连
                onopen: () => {
                    nextTick(() => {
                        if(this.firstEnter) this.socket.send({ type: 'CONTACT' })
                    })
                },
                onerror: () => {
                    this.messageUserList = []
                    this.messageHistoryAllList = []
                    sessionStorage.removeItem('messageUserList') // 删除用户列表缓存
                },
                timer: 10000 // 保活周期 10s
            })
            this.setDefaultMessage()
            // this.setDefaultError()
        }
    }
})

export default useSocketStore
